package ar.edu.caece.pl.asin.model.impl;

import ar.edu.caece.pl.asin.manager.IAnalizadorSintactico;
import ar.edu.caece.pl.asin.manager.impl.AbstractAnalizadorSintactico;
import ar.edu.caece.pl.asin.model.ITokenStream;

public class Factor2 extends AbstractAnalizadorSintactico implements IAnalizadorSintactico {
	
	/* INICIALIZACION */	
	public Factor2 ( ITokenStream ts ) {
		super(ts, false);
	}
	public Factor2 ( ITokenStream ts, boolean debugMode ) {
		super(ts,debugMode);
	}
	
	
	/** 
	 * Devuelve true si reconoce expresiones en parametros de llamada a una funcion o procedimiento
	 */
	public boolean reconocer () {

		boolean recognized = true; //(asumimos correctitud hasta demostrar lo contrario)
		
		//----------------------------------------------
		//Agrego info de debug de la produccion
		em.debug( "Reconocer Factor2:");		//TODO pasarlo a accion semantica
		//----------------------------------------------
		
		/* <FACTOR_2> -> <EXP> <CALLING_PARAMS> |
             			 LAMBDA */

		if ( Expresion.primeros(this.getTokenSiguiente()) ) {
			//<FACTOR_2> -> <EXP> <CALLING_PARAMS>
			
			//----------------------------------------------
			//Agrego info de debug de la produccion
			em.debug( "<FACTOR_2> -> <EXP> <CALLING_PARAMS>", this.getTokenSiguiente() );
			//----------------------------------------------
			
			// Reconocer Expresion
			IAnalizadorSintactico expresion = new Expresion(this.tokenStream,this.debugMode);
			recognized &= expresion.reconocer();
			
			// Reconocer CallingParams
			IAnalizadorSintactico cp = new CallingParams(this.tokenStream,this.debugMode);
			recognized &= cp.reconocer();
		} 
		return recognized;
	}
	
}
